package demo5;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/*
    使用@Component注解标注的类可以被Spring容器管理，除了该注解外，还有几个常见的注解，如果被其标注也受到Spring容器管理

    @Repository 将来标注的都是数据持久层的类（与数据库打交道的类）

    @Service  将来标注的都是业务层的类

    @Controller  将来标注的都是控制器层的类（在SpringMVC框架中使用）

 */
@Component
//@Repository
//@Service
//@Controller
public class Person {
    /**
     *  @Autowired是Spring框架提供的注解，用于告知Spring容器当前类需要依赖此类并要求其进行自动装配
     *
     * @Resource是java原生提供的注解，Spring容器也可以使用它来装配依赖
     * @Resource注解默认也是依靠类型匹配方式注入依赖的，如果存在多个可匹配依赖依然会抛出冲突异常
     *      例如同时找到Shirt、Sweater时
     *
     *      如果出现冲突时，解决办法：
     *      可以根据name参数指定的类名装配Spring管理的一个类
     *      注意:类名这里首字母要小写
     *      @Resource(name="sweater") 装配Sweater这个类的实例
     *      @Resource(name="shirt") 装配Shirt这个类的实例
     *      这样子做的弊端：限制被调用方的类名
     */
    /*
    @Autowired
    可以在Resource中传入name参数，指定依赖的类名字（首字母小写）
    @Resource
    @Resource(name = "shirt")
    @Resource(name = "sweater")
    private Clothes clothes;
    */

    //可以根据属性名与依赖的类名进行装配：拼写要一致，这里的属性名仅首字母小写
    @Resource
    //private Clothes sweater;  //这样会装配Sweater这个类
    private Clothes shirt;  //这样会装配Shirt这个类
    public void play(){
        // clothes.wear();
        // sweater.wear();
        shirt.wear();

        System.out.println("出去玩");
    }
}
